﻿
namespace Microsoft.AspNetCore.Components;

/// <summary>
/// 这个组件允许禁用预呈现
/// </summary>
public sealed partial class DisablePreRendering : ComponentBase, IContentComponent<RenderFragment>
{
    #region 说明文档
    /*问：什么是预呈现？
      答：请自行查阅Blazor文档
    
      问：禁用预呈现有什么好处？
      答：好处如下：
    
      1.允许在任意生命周期方法，包括OnInitializedAsync中调用JS互操作，
      因为这个组件是在浏览器中出生的，它没有服务器预渲染阶段
    
      2.组件不必呈现两次，可以节约一些性能，
      如果组件初始化方法不是幂等的，可能能够解决一些Bug

      3.反爬虫
    
      问：禁用预呈现有什么坏处？
      答：坏处如下：
      
      1.对搜索引擎不友好
    
      2.如果将这个组件放在组件树的最顶层，可能会产生一个比较长时间的白屏，
      但是，这个问题可以通过以下手段缓解：
      
      不要把它放置在组件树的最顶层，而是在网页的背景被渲染完毕后，
      再禁用子组件的预呈现，这样的话，用户能够先看到网页的背景，不会那么焦虑*/
    #endregion
    #region 组件参数
    #region 组件的子内容
    [Parameter]
    [EditorRequired]
    public RenderFragment ChildContent { get; set; }
    #endregion
    #endregion
    #region 内部成员
    #region 是否已初始化
    /// <summary>
    /// 如果这个值为<see langword="true"/>，
    /// 表示组件已经初始化
    /// </summary>
    private bool Initialization { get; set; }
    #endregion
    #region 重写OnAfterRender
    protected override void OnAfterRender(bool firstRender)
    {
        if (firstRender)
        {
            Initialization = true;
            this.StateHasChanged();
        }
    }
    #endregion
    #endregion
}
